- Introduction
- Foreword
- About the Author
-
- A Brief History of MFC
- The MFC Class Hierarchy
- CObject
- CCmdTarget
- CWinThread
- CWinApp
- CWnd
- CFrameWnd
- CView
- CDocument
- Summary
- Creating an Application
- Starting and Using MFC AppWizard
- The AppWizard-Generated Code
- Modifying the Application
- Adding Dialog Controls
- Adding Initialization
- Using Dialog Controls
- ToolTips
- Enabling ToolTips
- Displaying Text
- Dialog Data Exchange
- Standard DDX
- UpdateData
- Using Standard Dialog Boxes
- File Open/Save
- Color Selector
- Font Selector
- Print Dialog
- Summary
Initializing and Using the Common Controls
Notifications for Windows Common Controls
- The Notification Message Structure
- Overview of the Notification Process
- A Better Notification Handling Scheme
- Specifying Notification Ranges with ON_NOTIFY_RANGE
Hot Key Controls: Class CHotKeyCtrl
- CHotKeyCtrl Class Methods
- Creating and Initializing a CHotKeyCtrl Object
- Using a Hot Key Control
Spin Controls: Class CSpinButtonCtrl
- Spin Control Styles
- CSpinButtonCtrl Messages
- CSpinButtonCtrl Class Methods
- Creating and Initializing a Spin Control
- Sample Program: SPIN1
Slider Controls: Class CSliderCtrl
- Slider Control Styles
- CSliderCtrl Messages
- CSliderCtrl Class Methods
- Creating and Initializing a Slider Control
- Sample Program: Slider Controls (SLIDER1)
- Sample Program: SLIDER1
Progress Bar Controls: Class CProgressCtrl
- CProgressCtrl Class Methods
- Creating and Initializing a CProgressCtrl Object
- Using a Progress Control
Image Lists: Class CImageList
- CImageList Class Methods
- Creating and Initializing a CImageList Control
List View Controls: Class CListCtrl
- List View Control Styles
- Image Lists and the List View Control
List View Items and Subitems
- List View Notification Messages
- Creating and Initializing a CListCtrl Object
- Using the List View Control
Tree View Controls: Class CTreeCtrl
- Tree View Control Styles
- Tree View Notification Messages
- CTreeCtrl Class Methods
- Creating and Initializing a Tree View Control
- Using a CTreeCtrl Object
- Sample Program: TREELIST.EXE
Tab Controls: Class CTabCtrl
- Tab Control Styles
- Tab Control Notification Messages
- CTabCtrl Class Methods
- The Tab Item Structure (TC_ITEM)
- Creating and Initializing a Tab Control
- Using a Tab Control
Animate Controls: Class CAnimateCtrl
- Animate Control Styles
- Animate Control Notification Messages
- CAnimateCtrl Class Methods
- Creating and Initializing an Animate Control
- Using an Animate Control
Rich Edit Controls: Class CRichEditCtrl
- Rich Edit Control Window Styles
- The Character Format Structure (CHARFORMAT)
- The Paragraph Format Structure (PARAFORMAT)
- CRichEditCtrl Class Methods
- CRichEditCtrl Line-Related Methods
- CRichEditCtrl Text-Selection Methods
- CRichEditCtrl Formatting Methods
- CRichEditCtrl Editing Methods
- CRichEditCtrl Clipboard Methods
- CRichEditCtrl General-Purpose Methods
- Creating and Initializing a Rich Edit Control
- Using a Rich Edit Control
Summary
Device Contexts
The Graphics Device Interface
- MFC Wrapping
MFC Device Context Classes
- The Base Class: CDC
- Painting with Class CPaintDC
- Managing Client Areas with Class CClientDC
- Managing Frame Windows with Class CWindowDC
Windows Graphic Objects
- Pens: Class CPen
- Brushes: Class CBrush
- Fonts: Class CFont
- Bitmaps: Class CBitmap
- Palettes: Class CPalette
- Regions: Class CRgn
GDI Coordinate Systems
- Logical Mapping Modes
Vector Graphics
- Drawing Modes
- Lines and Polylines
- Rectangles
- Regions
- Polygons
- Ellipses
- Fonts and Text
- Font Characteristics
- The TEXTMETRIC Structure
- The LOGFONT Structure
- Font Creation
- Drawing Text
- Sample Program: Vector Graphics and Text Methods (VECTEXT1.EXE)
- Raster Graphics
- Named Raster Operations (ROPs)
- Bitmaps
- Device-Dependent Bitmaps
- Device-Independent Bitmaps (DIBs)
- The CBitmap Class
- Transferring and Contorting Bitmaps
- Bitmap Resources
- Tacking Resources onto an Executable File
- Getting Image Resources out of an Executable File
- Sample Program: Exploring Bitmap Resources (BITMAP1)
- Summary
A Validating Edit Control
The Clock Static Control
- Control Metrics
- Painting the Face
- Locating the Hands
- Painting the Hands
- Setting the Time
- Pitfalls of Subclassing Standard Controls
The Hyperlink Control
- Implementation Strategy
- Font Processing
- Painting the Window
- Controlling the Cursor
- Mouse Input
- Keyboard Input
- Launching the Link
Advanced Custom Control Topics
- Subclassing Limitations
- Notifications
- Using the Resource Editor with Custom Classes
Summary
The MFC Application Object
- CWinApp and Application Lifetime
- The CWinApp Data Members
- The CWinApp Member Functions
- Functionality in InitInstance
- OLE Container Support
- 3D Look for Windows NT 3.5x
- Registry Usage
- Most Recently Used Files List
- SDI and MDI Document/View
- Main Frame Window Creation
- Automation Support
- Rich Edit Control Support
- Command-Line Handling
Message Routing, Message Maps, and Message Categories
- Message Routing
- PreTranslateMessage
- Message Maps
Idle Processing
- OnIdle
- Idle Processing for Dialogs
The Splash Screen Component
Summary
- Documents, Frames, and Views
- Document Templates
- Creating New Documents
- Opening New Files
- Single Versus Multiple Document Templates
- Views
- The CView Class
- The CScrollView Class
- The CFormView Class
- The Database View Classes
- The Control Views
- Changing Views in an SDI
- Using the MDI
- Summary
Responding to the User
- Keyboard Messaging
- Handling Keyboard Messages
- Mouse Messaging
- Handling Mouse Messages
User Interfaces and AppWizard
Extending Menus
- Obtaining Menus and Pop-up Menus
- Adding Menu Items
- Using Floating Pop-up Menus
Putting Control Bars to Use
- Using Toolbars and Rebars
- Using Status Bars
- Showing and Hiding Control Bars
- Supporting ToolTips
Updating the User Interface
Property Sheets and Wizards
- Creating a Simple Wizard
Splitting a View
Summary
Printing Fundamentals
Printing with MFC
- Printing in the View
- The PrintInfo Object
- Printing Menu Commands
Printing and GDI Mapping Modes
WYSIWYG Printing
- Application Resources
- The Application Class
- The View Class
Pagination
- Printing with a Known Page Count
- Printing with an Unknown Page Count
- Printing Page Numbers
Stopping and Aborting Print Jobs
- Halting a Print Job in OnPrepareDC()
- Halting a Print Job in OnPrint()
Summary
- A Little History
- Interfaces, Objects, and Methods
- Some Terminology
- A Real-World View
- The IUnknown Interface
- Servers, Clients, and Classes
- The COM Runtime Environment
- Defining the Class Factory
- How Are COM Objects Reused?
- Marshaling and Threading
- Marshaling
- Threading
- COM, OLE, and Automation
- IDispatch
- Automation Servers, Objects, and Controllers
- Supporting Both IDispatch and IUnknown
- Persisting COM Data
- Structured Storage
- Identifying COM Data (Monikers)
- Transferring Data
- Uniform Data Transfer
- Connectable Objects
- DCOM
- Object Creation
- Invoking Methods
- Security Issues
- Some Important Information
- BSTR
- SAFEARRAY
- HRESULT
- VARIANT
- Further Reading
- Summary
Understanding the Afx Global Functions
- Application Lifetime Control
- Client Control Management
- Connection Point Management
- Control Registration
- Exceptions
- Initialization
- Licensing
- Type Information
Reviewing the OLE Macros
- Class Factories
- Client/Container Common Commands
- Control Property Persistence
- Dialog Data Exchange
- Dispatch Maps
- Event Maps
- Property Page Data Mapping
- Property Pages
- Type Library Access
MFC and the OLE Class Categories
- Active Document
- Automation
- Common Dialogs for OLE
- Container
- Control
- Drag and Drop (Universal Data Transfer)
- Document Servers
- Support
Summary
Document Servers
Server Types
- Full Server
- Active Document
- Container/Server
- Mini-Server
Document Server Design
- OLE Documents
- Active Documents
Building an Active Document Server
- Persistence
- Rendering the View
Automation Servers
IDispatch
- GetIDsOfNames
- GetTypeInfo
- GetTypeInfoCount
- Invoke
IDispatch-Derived Interface in ODL
Calling Methods Through IDispatch
- GetIDsOfNames
- Type Information Methods
- Invoke
Dispinterfaces Differ from Interfaces
Dual Interfaces
The Variant
An Automation Server Using MFC
- Server Type
- Declaring and Defining Additional Dispinterfaces
- Adding Methods and Properties
Summary
IDispatch and Its Place in Automation
Interface Definition for Automation Servers
- IDL and ATL
- ODL and MFC
- Dual Interfaces
MFC and Automation
- Controller
- Connecting to a Server
- Server Review
Building a Controller
- Using COleDispatchDriver
- Remote Automation
Summary
Development Strategy
- MFC
- ATL
- MFC and ATL
Control Development
Two Faces of a Control
- Runtime
- Design Time
Subclassing a Control
- MFC
- ATL
Component Categories
- ICatRegister
- ICatInformation
Methods, Properties, and Events
- Properties
- Methods
- Events
Property Pages
- Property Pages in ATL
- Property Pages in MFC
Component Registration
- Registration Scripts
- Registration and Controls
COM Object Subkeys
Building an MFC Control
Interface Definition
A Quick ATL Port
Summary
Active Document Container
- Storage
- Site Objects
- In-Place Activation
- Document Extensions
- Building the Simplest Active Document Container
OLE Controls
- Adding Containment to an Existing Project
- ActiveX Container
- Control Containment and Events
Summary
What Is ATL and Why Is It Important for Programming in MFC?
Helpful ATL COM Support for MFC Applications
- COM Pointers the Smart Way
- Other ATL COM Support
Advanced ATL Support for MFC Applications
- Begin with Your MFC Application
- Add the Required ATL Support
Summary
Scripting Basics
- Scripting Interfaces
- Dual Interfaces
Object Models
Implementing a Scripted Application
- Object Implementation
Summary
- Relational Database Concepts
- Tables
- Columns
- Records
- Cursors
- Transactions
- Storing and Retrieving Data
- SELECT
- INSERT
- DELETE
- UPDATE
- Database Communication Mechanisms
- ODBC
- DAO
- Which Methodology Should I Use?
- ODBC/MFC
- CDatabase
- CRecordset
- DAO
- CDaoWorkspace
- CDaoDatabase
- CDaoRecordset
- CDaoTableDef
- CDaoQueryDef
- Summary
The COM Approach
- OLE DB
- ADO
- Which One Should I Use?
OLE DB Consumers Using the ATL Wrapper Classes
- CDataSource
- CSession
- Accessors
- Rowsets
- Accessing Datasource Data
ADOConnection
ADORecordset
ADOCommand
ADOField
ADOProperty
ADOParameter
ADOError
Summary
- Strings and String Classes
- Inside the CString Class
- Practical CString Usage
- CString Summary
- Collections
- Inside Collection Classes
- Templated Collections
- The UNL_MultiEd Application
- Overview
- An STL Approach
- Summary
The CFile Class
- Processing Files with CFile
Inside the CFile Class
- The CStdioFile Class
- The CMemFile Class
- The CSharedFile Class
The CFileDialog Class
The User-Defined CFileDialog Class
Practical Usage of CFile and CFileDialog
- Opening a File
- Reading Data from a File
A Classical Approach
- What Are Streams?
Summary
Types of Exceptions
Structured Exception Handlers
Nesting of Structured Exception Handlers
Raising Structured Exceptions
Cleaning Up After an Exception
MFC Exceptions
- MFC CException-Derived Classes
- CMemoryException
- CNotSupportedException
- CArchiveException
- CFileException
- CResourceException
- COleException
- CDbException
- COleDispatchException
- CUserException
- CDaoException
- CInternetException
Deriving Your Own MFC-Compliant Exception Objects
Deleting Exceptions
Using MFC Exception Macros
Mixing Exceptions
Summary
- DHTML, MSIE, and the Internet
- Using the Internet Explorer Web ActiveX Control
- Internet Explorer ActiveX Control Basics
- CHtmlView
- CHtmlView and the Document/View Relationship
- CHtmlView and COM
- Using the Internet Explorer ActiveX Control in a Dialog Box
- Using DHTML
- The DHTML Object Model
- The Document Object
- Other DHTML Objects
- Collection Objects
- DHTML COM Interfaces
- Obtaining the Document DHTML Interface
- Obtaining the DHTML Collections Interfaces
- Using the DHTML Interface
- The DHTML Element Interface Methods
- Document Navigation
- Summary
How Do Network Communications Work?
- Sockets, Ports, and Addresses
Winsock and MFC
- Initializing the Winsock Environment
- Creating a Socket
- Making a Connection
- Sending and Receiving Messages
- Closing the Connection
- Socket Events
- Controlling Event Triggering
- Detecting Errors
- Getting Socket Information
- Sockets and I/O Serialization
Building a Networked Application
- Creating the Application Shell
- Window Layout and Startup Functionality
- Inheriting from the CAsyncSocket Class
- Connecting the Application
- Sending and Receiving
- Ending the Connection
Summary
Web Application Protocols and WinInet
- Hypertext Transfer Protocol
- File Transfer Protocol
- Gopher Protocol
- WinInet API and MFC
Internet Session Basics
- CInternetSession
- CInternetFile
- CInternetException
- CInternetConnection
- Building a Simple WinInet Application
Application-Level Functionality
- HTTP Classes
- FTP Classes
- Gopher Classes
- Building a Simple FTP Client
Summary
The Foundation
From There to Here
From GET to POST
Adding Some Form Elements
- Change the Form
- Change the Parse Map
- Declare and Use the Handler Function
- Add a Radio Button
Other Form Input Elements
- Change the Form
- Change the Parse Map
- Change the Handler Function
Summary
The Messaging Application Programming Interface
- Client Applications
Two Higher-Level Alternatives: Simple MAPI and CMC
- Simple MAPI
- Common Messaging Calls
- The MapiMessage Structure
- The MapiFileDesc Structure
Limited MAPI Functionality in MFC
The CDocument Connection
- Doing MAPI the MFC Way
- The CDocument::OnFileSendMail() Method
Sample Program: MAPI1.EXE
Summary
Overview
- Assisted Telephony
- Basic Telephony Service
- Supplemental Telephony Service
- Extended Telephony Service
History of TAPI
- TAPI 1.3
- TAPI 1.4
- TAPI 1.5
- TAPI 2
- TAPI 2.1
- TAPI 2.2
- TAPI 3
Using Assisted Telephony
Using Basic Telephony
- Configuring TAPI
- Connecting with TAPI
- Transmitting Data with TAPI
- Disconnection with TAPI
- Terminating a TAPI Session
Summary
- What Is OpenGL?
- Graphics Boot Camp
- Core Terms and Key Concepts
- The Basic Mathematics of Graphics Programming
- OpenGL Boot Camp
- OpenGL Datatypes
- OpenGL Function Naming Conventions
- OpenGL Render Function Scoping
- The OpenGL Matrix Stack
- The OpenGL Rendering Context
- Minimal OpenGL Program and a Custom View
- Creating Your Basic MFC Application
- Adding the Custom OpenGL Base Class
- Integrate the Custom View Class into Your Application
- Build Your 3D Scene
- 2D and 3D Models
- Basic Model Development
- Model Transformations
- Display Lists
- Light
- The Basics of Light in OpenGL
- Types of Light
- Object Material Properties
- Texture Mapping
- OpenGL Images and Windows Device-Independent Bitmaps
- Applying Texture
- Special Effects
- Blending
- Fog
- Summary
- What Is DirectX?
- DirectX in a Nutshell
- DirectX Components
- DirectX Basics
- Differences in COM Programming Style and DirectX
- DirectX Component Startup Sequence
- DirectDraw Basics
- Initializing DirectDraw
- DirectDraw and Palettes
- DirectDraw Surfaces
- DirectDraw Page Flipping
- DirectDraw from a Window
- Using DirectDraw in Practice
- Surfaces and Bitmaps
- Windowed Rendering
- Error Handling
- DirectDraw Shutdown
- Summary
Multimedia Fundamentals
The DirectX Media Player Control
- Media Formats Supported by the Media Player Control
- Inside the Media Player Control
- The CMediaPlayer Class
Using the Media Player Control
Playing Sound
- Working with Waves
- Revisiting DirectSound
- Using DirectSound to Play Sound Effects
Summary
- Registry Usage
- Configuration
- Services Information
- State
- User Preferences
- The Registry Structure
- Programmatic Control of the Registry
- The Registry API
- The Registry Sample Application
- The Registry Key Editor Dialog
- Creating a New Key
- Deleting a Key
- Deleting a Name/Value Pair
- A Word About Wrapping the Registry Functions
- A Word About Installation
- Summary
Advantages of DLLs
- Code Elimination
- Modularity and Packaging
- Extensibility
Inside an AFX DLL
Exporting Classes, Functions, and Data
- The Big Deal About Exports
- Mangled Names
- Exporting Classes
- What Goes Around, Comes Around
- Exporting Explicit Functions
- Exporting Data
- Exporting MFC Data
- Exporting the Destructor
- Export Toolkit include Files
- What to Export
Other DLL Issues
- AfxLoadLibrary and AfxFreeLibrary
- Designing for Extensibility and Reuse
- Resource Location
- Multiple Module Definition Files
- Load Addresses and the Linker
Summary
Property Sheets and Property Pages
- The CPropertySheet and CPropertyPage Classes
- The Wizard Walk and the Property Sheet Connection
Creating a Wizard
- Setting the Wizard Mode
- Enabling the Wizard Buttons
- Displaying the Wizard
- Wizard Notification Messages
Sample Program: Off to See the Wizard (WIZARD1.EXE)
- Creating Wizard Page Dialog Template Resources
- Create a Dialog Class for Each Dialog Resource
- Exploring the Welcome Page: Class CIntroPage
- Exploring the About You Page: Class CPage1
- Updating Wizard Information for CPage2 and CPage3
- Creating and Displaying the Wizard
Summary
Index